package proc

import (
	"common"
	"encoding/json"
	"fmt"
	"net"
	"server/dao"
	"utils"
)

type UserProc struct {
	Conn net.Conn
	UserId int
}

// Login 用户登录
func (this *UserProc) Login(mes *common.Message) (err error){
	var user common.User

	if err = json.Unmarshal([]byte(mes.Data), &user); err != nil {
		fmt.Println("login unmarshal failed")
		return
	}
	var resultMes common.Message
	resultMes.Type = common.LoginType

	var res common.Res
	// login
	u, err := dao.UserDaoUnique.Login(user)
	if err != nil {
		res.Code = common.RegisterError
		res.Err = err.Error()
	} else {
		res.Code = common.Success
		this.UserId = u.UserId

		// 添加到在线用户列表
		onlineUsers.AddOnlineUser(this)
		// 通知自己上线消息
		this.Notify(u.UserId)

		for id, _ := range onlineUsers.onlineUsers {
			res.Users = append(res.Users, id)
		}

	}

	// 处理响应 user
	data, err := json.Marshal(res)

	if err != nil {
		fmt.Println("json.Marshal(res) 序列化失败")
		return
	}
	resultMes.Data = string(data)

	data, err = json.Marshal(resultMes)
	if err != nil {
		fmt.Println("json.Marshal(resultMes) 序列化失败")
		return
	}

	ut := &utils.Utils{
		Conn: this.Conn,
	}
	return ut.WriteMes(&resultMes)
}

// Register 用户注册
func (this *UserProc) Register(mes *common.Message) (err error){
	var user common.User

	if err = json.Unmarshal([]byte(mes.Data), &user); err != nil {
		fmt.Println("login unmarshal failed")
		return
	}
	var resultMes common.Message
	resultMes.Type = common.LoginType

	var res common.Res
	err = dao.UserDaoUnique.Register(user)
	if err != nil {
		res.Code = common.RegisterError
		res.Err = err.Error()
	} else {
		res.Code = common.Success
	}


	// 处理响应 user
	data, err := json.Marshal(res)

	if err != nil {
		fmt.Println("json.Marshal(res) 序列化失败")
		return
	}
	resultMes.Data = string(data)

	data, err = json.Marshal(resultMes)
	if err != nil {
		fmt.Println("json.Marshal(resultMes) 序列化失败")
		return
	}

	ut := &utils.Utils{
		Conn: this.Conn,
	}
	return ut.WriteMes(&resultMes)
}

func (this *UserProc) Notify(userId int) {
	for id, up := range onlineUsers.onlineUsers {
		if id == userId {
			continue
		}
		up.NotifyOther(userId)
	}
}

// NotifyOther 通知自己上线消息
func (this *UserProc) NotifyOther(id int) {
	var notifyUser common.NotifyUser
	notifyUser.Id = id
	notifyUser.Status = common.Online

	data, err := json.Marshal(notifyUser)
	if err != nil {
		fmt.Println("notifyOther json.Marshal(notifyUser) err", err)
		return
	}

	var mes common.Message
	mes.Type = common.NOTIFYTYPE
	mes.Data = string(data)

	data, err = json.Marshal(mes)
	if err != nil {
		fmt.Println("notifyOther json.Marshal(mes) err", err)
		return
	}

	// send mes
	ut := &utils.Utils{Conn: this.Conn}
	if err := ut.WriteMes(&mes); err != nil {
		fmt.Println("notifyOther ut.WriteMes(&mes) err", err)
	}
}